# coding: utf-8
# File   :  run
# Author :  wangsheng
# @Time  :  2025/5/7 上午11:04
import os
import time
import traceback

import pytest
from loguru import logger

from utils import config
from utils.read_files_tool.allure_report_tool import AllureFileReader


def run():
    """
    执行测试运行器的主要函数。
    这个函数负责启动测试执行，生成报告。
    """
    try:
        logger.debug(
            """========================开始执行{}项目========================""".format(config.project_name)
        )

        # 调用pytest.main执行测试。这些参数用于控制测试的运行和报告的生成。
        pytest.main(['-s', '-W', 'ignore:Module already imported:pytest.PytestWarning',
                     '--alluredir', './report/tmp', "--clean-alluredir"])
        """"
           --reruns: 失败重跑次数
           --count: 重复执行次数
           -v: 显示错误位置以及错误的详细信息
           -s: 等价于 pytest --capture=no 可以捕获print函数的输出
           -q: 简化输出信息
           -m: 运行指定标签的测试用例
           -x: 一旦错误，则停止运行
           --maxfail: 设置最大失败次数，当超出这个阈值时，则不会在执行测试用例
            "--reruns=3", "--reruns-delay=2"
        """
        # 生成Allure测试报告。
        os.system(r"allure generate ./report/tmp -o ./report/html --clean")
        # 确保报告文件存在
        report_file = "./report/html/index.html"  # 假设index.html是生成后一定会存在的文件
        while not os.path.exists(report_file) or os.path.getsize(report_file) == 0:
            time.sleep(1)  # 等待1秒后再次检查
        # 从报告中获取测试结果统计信息。
        allure_data = AllureFileReader.get_case_count()
        # 指定文件路径
        file_path = "./report/summary.txt"

        # 打开文件并写入数据
        with open(file_path, 'w') as file:
            file.write(f"Passed={allure_data.passed}\n")
            file.write(f"Failed={allure_data.failed}\n")
            file.write(f"Broken={allure_data.broken}\n")
            file.write(f"Skipped={allure_data.skipped}\n")
            file.write(f"Total={allure_data.total}\n")
            file.write(f"Rate={allure_data.pass_rate}%\n")
            file.write(f"Time={allure_data.time} sec\n")

    except Exception:
        e = traceback.format_exc()
        logger.error(e)
        raise


if __name__ == '__main__':
    run()
